% 步进电机驱动脉冲 = 目标速度(mm/s) / ( 直线距离(mm/转) / (360/步距角) / 细分 )
% 电机转速(RPM) = 目标速度(mm/s) / 直线距离(mm/转) * 60
% 加速度计算 v^2 = u^2 + 2ad
% 牛顿第二定律 a = Fm
% 直线距离(mm/转)是电机转动一圈，滑块移动的距离。
% 末端扭矩 Tua = Fr F:负载施加的阻力,r轴半径。这个公式目前没有考虑电机惯量


%期望的参数
target_speed = 1000;                            %   期望的滑块速度(mm/s)
accelerating_distance = 0.05;                   %   加速距离(m)
%已知量
loading = 1;                                    %   载荷(Kg)
straight_line_distance = 30 : 1 : 200;          %   电机一转滑块运动的距离(mm/转)
steep_angle = 1.8;                              %   步距角(度）
transmission_efficiency = 0.8;                  %   传动效率
steep_rotate = 360 / steep_angle;               %   电机一转的总步数
subdivide = [8, 16, 32, 64, 128, 256];          %   驱动器的细分
synchronous_wheel_radius = 0.0374;              %   同步轮半径(m)



% 初始化存储结果的数组
resolution_ratio = zeros( length(subdivide), length(straight_line_distance) );  % 分辨率
Motor_f = zeros( length(subdivide), length(straight_line_distance) );           %电机驱动信号频率
RPM = zeros( length(subdivide), length(straight_line_distance) );               %转速

% 加速度 (m/s^2)
accelerated_speed = (target_speed / 1000)^2 / (2 * accelerating_distance);
% 达到加速度需要的力
driving_force = accelerated_speed / loading / transmission_efficiency;
% 末端扭矩
end_torque = driving_force * synchronous_wheel_radius;

for i = 1 : length(subdivide)
    for j = 1 : length(straight_line_distance)
        % 分辨率
        resolution_ratio(i,j) = straight_line_distance(j) / steep_rotate / subdivide(i);
        % 驱动信号频率
        Motor_f(i,j) = target_speed / ( straight_line_distance(j) / steep_rotate / subdivide(i) ) / 1000;
        % 转速
        RPM(i,j) = target_speed / straight_line_distance(j) * 60;
    end
end


disp(accelerated_speed);
disp(driving_force);
disp(end_torque);


figure;
subplot(3, 3, 1); % 创建第一个子图，2行2列，当前绘制的是第一个子图
plot(straight_line_distance, resolution_ratio(1,:), 'b', ...
     straight_line_distance, Motor_f(1,:), 'r', ...
     straight_line_distance, RPM(1,:), 'g');
xlabel('直线距离(mm/转)'); % 设置 x 轴标签
% ylabel('t');     % 设置 y 轴标签
title('8细分');  % 设置子图标题
legend('分辨率(步/mm)', '电机驱动信号频率(KHz)', '转速(RPM)'); % 添加图例，标识每条曲线的含义
grid on; % 打开网格线

subplot(3, 3, 2); % 创建第一个子图，2行2列，当前绘制的是第一个子图
plot(straight_line_distance, resolution_ratio(2,:), 'b', straight_line_distance, Motor_f(2,:), 'r', straight_line_distance, RPM(2,:), 'g');
xlabel('直线距离(mm/转)'); % 设置 x 轴标签
% ylabel('t');     % 设置 y 轴标签
title('16细分');  % 设置子图标题
legend('分辨率(步/mm)', '电机驱动信号频率(KHz)', '转速(RPM)'); % 添加图例，标识每条曲线的含义
grid on; % 打开网格线

subplot(3, 3, 3); % 创建第一个子图，2行2列，当前绘制的是第一个子图
plot(straight_line_distance, resolution_ratio(3,:), 'b', straight_line_distance, Motor_f(3,:), 'r', straight_line_distance, RPM(3,:), 'g');
xlabel('直线距离(mm/转)'); % 设置 x 轴标签
% ylabel('t');     % 设置 y 轴标签
title('32细分');  % 设置子图标题
legend('分辨率(步/mm)', '电机驱动信号频率(KHz)', '转速(RPM)'); % 添加图例，标识每条曲线的含义
grid on; % 打开网格线

subplot(3, 3, 4); % 创建第一个子图，2行2列，当前绘制的是第一个子图
plot(straight_line_distance, resolution_ratio(4,:), 'b', straight_line_distance, Motor_f(4,:), 'r', straight_line_distance, RPM(4,:), 'g');
xlabel('直线距离(mm/转)'); % 设置 x 轴标签
% ylabel('t');     % 设置 y 轴标签
title('64细分');  % 设置子图标题
legend('分辨率(步/mm)', '电机驱动信号频率(KHz)', '转速(RPM)'); % 添加图例，标识每条曲线的含义
grid on; % 打开网格线

subplot(3, 3, 5); % 创建第一个子图，2行2列，当前绘制的是第一个子图
plot(straight_line_distance, resolution_ratio(5,:), 'b', straight_line_distance, Motor_f(5,:), 'r', straight_line_distance, RPM(5,:), 'g');
xlabel('直线距离(mm/转)'); % 设置 x 轴标签
% ylabel('t');     % 设置 y 轴标签
title('128细分');  % 设置子图标题
legend('分辨率(步/mm)', '电机驱动信号频率(KHz)', '转速(RPM)'); % 添加图例，标识每条曲线的含义
grid on; % 打开网格线

subplot(3, 3, 6); % 创建第一个子图，2行2列，当前绘制的是第一个子图
plot(straight_line_distance, resolution_ratio(6,:), 'b', straight_line_distance, Motor_f(6,:), 'r', straight_line_distance, RPM(6,:), 'g');
xlabel('直线距离(mm/转)'); % 设置 x 轴标签
% ylabel('t');     % 设置 y 轴标签
title('128细分');  % 设置子图标题
legend('分辨率(步/mm)', '电机驱动信号频率(KHz)', '转速(RPM)'); % 添加图例，标识每条曲线的含义
grid on; % 打开网格线


% 创建表格数据
data = {
    '加速度 (m/s^2)', accelerated_speed;
    '达到加速度需要的力 (N)', driving_force;
    '末端扭矩 (N·m)', end_torque
};

% 创建表格
uitable('Data', data, 'ColumnName', {'参数', '值'}, 'Position', [100 100 400 150]);
